/**
 * 集合
 */

// 封装
function Set() {
    this.items = {}

    // add方法
    Set.prototype.add = function(value) {
        if (this.has(value)) return false
        this.items[value] = value
        return true
    }
    // has方法
    Set.prototype.has = function(value) {
        return this.items.hasOwnProperty(value)
    }
    // remove方法
    Set.prototype.remove = function(value) {
        if (!this.has(value)) return false
        delete this.items[value]
    }
    // clear方法
    Set.prototype.clear = function() {
        this.items = {}
    }
    // size方法
    Set.prototype.size = function() {
        return Object.keys(this.items).length
    }
    // values方法
    Set.prototype.values = function() {
        return Object.keys(this.items)
    }
    // 并集
    Set.prototype.union = function(newSet) {
        // 1. 定义一个空集合
        var unionSet = new Set()
        // 2. 将当前集合加入到空集合中
        var values = this.values()
        for(i = 0; i < values.length; i ++) {
            unionSet.add(values[i])
        }
        // 3. 将新集合加入到空集合中
        var values = newSet.values()
        for(i = 0; i < values.length; i ++) {
            unionSet.add(values[i])
        }
        return unionSet
    }
    // 交集
    Set.prototype.intersection = function(newSet) {
        // 1. 定义一个空集合
        var intersectionSet = new Set()
        // 2. 取交集
        var values = this.values()
        for(i = 0; i < values.length; i ++) {
            var item = values[i]
            if (newSet.has(item)) {
                intersectionSet.add(item)
            }
        }
        return intersectionSet
    }
    // 差集
    Set.prototype.difference = function(newSet) {
        // 1. 定义一个空集合
        var differenceSet = new Set()
        // 2. 取差集
        var values = this.values()
        for(i = 0; i < values.length; i ++) {
            var item = values[i]
            if (!newSet.has(item)) {
                differenceSet.add(item)
            }
        }
        return differenceSet
    }
    // 子集
    Set.prototype.sub = function(newSet) {
        var values = this.values()
        for(i = 0; i < values.length; i ++) {
            var item = values[i]
            if (!newSet.has(item)) {
                return false
            }
        }
        return true
    }
}

// 测试代码
var set = new Set()
set.add("1")
set.add("2")
set.add("3")
set.add("4")
set.add("5")
set.add("6")
console.log(set.values()) // [ '1', '2', '3', '4', '5', '6' ]

set.remove("6")
console.log(set.values()) // [ '1', '2', '3', '4', '5' ]
console.log(set.size()) // 5

var new_set = new Set()
new_set.add("7")
new_set.add("8")
new_set.add("9")
console.log(new_set.values()) // [ '7', '8', '9' ]

console.log(set.union(new_set).values()) // ['1', '2', '3', '4', '5', '7', '8', '9']
console.log(set.intersection(new_set).values()) // [ '1', '2', '3' ]
console.log(set.difference(new_set).values()) // [ '1', '2', '3', '4', '5' ]
console.log(set.sub(new_set)) // false
